#ifndef PROJECTEVENT_H
#define PROJECTEVENT_H

#include <string>

#include "../../SDK/include/Events.h"

#define DECLARE_EVENT(T) \
public: \
    static Events::EventType type() { return Events::T; } \
    virtual Events::EventType GetType() const { return Events::T; } \
private:

#define DECLARE_PROJECT_EVENT_CLASS_DATALESS(T) \
class T##Event : public Events::Event \
{ \
    DECLARE_EVENT( T ) \
};

#define DECLARE_PROJECT_EVENT_CLASS_STRING(T) \
class T##Event : public Events::Event \
{ \
    DECLARE_EVENT( T ) \
    public: \
        std::string data; \
};

#define DECLARE_PROJECT_EVENT_CLASS_STRING_2(T) \
class T##Event : public Events::Event \
{ \
    DECLARE_EVENT( T ) \
    public: \
        std::string data[2]; \
};

#define DECLARE_PROJECT_EVENT_CLASS_PMDATA(T) \
class ProjectPrivate; \
class T##Event : public Events::Event \
{ \
    DECLARE_EVENT( T ) \
    public: \
        ProjectPrivate* d; \
};

#define DECLARE_PROJECT_EVENT_CLASS_PMDATA_STRING(T) \
class ProjectPrivate; \
class T##Event : public Events::Event \
{ \
    DECLARE_EVENT( T ) \
    public: \
        ProjectPrivate* d; \
        std::string data; \
};

DECLARE_PROJECT_EVENT_CLASS_PMDATA( ProjectImport )
DECLARE_PROJECT_EVENT_CLASS_PMDATA( ProjectExport )

/// build handle
DECLARE_PROJECT_EVENT_CLASS_PMDATA_STRING( ProjectBuild )
DECLARE_PROJECT_EVENT_CLASS_PMDATA_STRING( ProjectClean )
// DECLARE_PROJECT_EVENT_CLASS_PMDATA_STRING( ProjectInstall )
DECLARE_PROJECT_EVENT_CLASS_PMDATA_STRING( ProjectPrune )
DECLARE_PROJECT_EVENT_CLASS_PMDATA_STRING( ProjectRebuild )

#if 0
/// projectmanager data handle
DECLARE_PROJECT_EVENT_CLASS_STRING( ProjectAddFile )
DECLARE_PROJECT_EVENT_CLASS_STRING( ProjectRemoveFile )
DECLARE_PROJECT_EVENT_CLASS_STRING( ProjectRemoveFileOnDisk )
DECLARE_PROJECT_EVENT_CLASS_STRING_2( ProjectRenameFile )
DECLARE_PROJECT_EVENT_CLASS_STRING( ProjectAddFolder )
DECLARE_PROJECT_EVENT_CLASS_STRING( ProjectAddFolderRecursive )
DECLARE_PROJECT_EVENT_CLASS_STRING( ProjectRemoveFolder )
DECLARE_PROJECT_EVENT_CLASS_STRING( ProjectRemoveFolderOnDisk )
DECLARE_PROJECT_EVENT_CLASS_STRING_2( ProjectRenameFolder )


/// TODO: tmp...  remove it
DECLARE_PROJECT_EVENT_CLASS_PMDATA( ProjectPrintInfo )
#endif

#endif // PROJECTEVENT_H
